package Engine;

import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

/**
 * Classe dos ouvintes de eventos
 *
 * @author Gustavo Buzogany Eboli
 */
public class KeyManager extends KeyAdapter
{
    private static KeyManager myInstance;
    private KeyControl actionHandler;

    /**
     * M?todo construtor.
     * @param engine Ponteiro para a ?nica inst?ncia da engine.
     */
    public KeyManager(KeyControl actionHandler)
    {
        this.actionHandler = actionHandler;
    }

    public void setActionHandlerMaster(KeyManager km)
    {
        actionHandler.setMaster(km);
    }

    /**
     * Atribui qual vai ser o handler das acoes (Teclado). MenuActions = menu, KeyActions = Game
     * @param actionHandler
     */
    public void setActionHandler(KeyControl actionHandler)
    {
        this.actionHandler = actionHandler;
        actionHandler.setMaster(this);
    }

     /**
     * M?todo chamado quando alguma tecla ? pressionada.
     * @param e Evento de tecla.
     */
    @Override
    public void keyPressed(KeyEvent e)
    {
        char c = e.getKeyChar();
        if(c != 65535)
        {
            actionHandler.setKeyFlag(c, (byte) 1);
        } else {
            switch(e.getKeyCode()) {
                case KeyEvent.VK_UP:
                    actionHandler.setKeyFlag('w', (byte) 1);
                    break;
                case KeyEvent.VK_DOWN:
                    actionHandler.setKeyFlag('s', (byte) 1);
                    break;
                case KeyEvent.VK_LEFT:
                    actionHandler.setKeyFlag('a', (byte) 1);
                    break;
                case KeyEvent.VK_RIGHT:
                    actionHandler.setKeyFlag('d', (byte) 1);
                    break;
            }

        }
    }

    /**
     * M?todo chamado quando uma tecla ? solta
     * @param e Evento de tecla.
     */
    @Override
    public void keyReleased(KeyEvent e)
    {
        char c = e.getKeyChar();
        if(c != 65535)
        {
            actionHandler.setKeyFlag(c, (byte) 2);
        } else
        {
            switch(e.getKeyCode()) {
                case KeyEvent.VK_UP:
                    actionHandler.setKeyFlag('w', (byte) 2);
                    break;
                case KeyEvent.VK_DOWN:
                    actionHandler.setKeyFlag('s', (byte) 2);
                    break;
                case KeyEvent.VK_LEFT:
                    actionHandler.setKeyFlag('a', (byte) 2);
                    break;
                case KeyEvent.VK_RIGHT:
                    actionHandler.setKeyFlag('d', (byte) 2);
                    break;
            }
        }
    }

    /**
     * Forca uma tecla a algum estado. Necessario para quando se cria um novo jogo.
     * @param c
     */
    public void keyReleased(char c) {
        if(c != 65535)
        {
            actionHandler.setKeyFlag(c, (byte) 2);
        }
    }
}